﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "GcmpApiDeclaration.h"

namespace gcmp
{
    class ElementId;
    class IModelView;
    class IElementMoveContext;
    class ICalculatorCollection;
    class IGraphicsElementShape;
    class IElementParentReporter;
    
    class IDocument;
    class Vector3d;
    class CommandParameters;

    /// \brief 辅助对象的行为组件，用于扩展辅助对象的行为
    class GCMP_MODEL_INTERFACE_EXPORT IElementShapeHandleBehavior : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementShapeHandleBehavior, gcmp::IDbObject)

    public:
        /// \brief 析构函数
        /// \return 
        virtual ~IElementShapeHandleBehavior() {};

        /// \brief 获取所属文档
        ///
        /// \return 返回所属文档
        virtual IDocument* GetDocument() const = 0;

        /// \brief 获得对应辅助对象的ElementId
        ///
        /// \return 对应辅助对象的ElementId
        virtual ElementId GetElementShapeHandleId() const = 0;


        /// \brief 设置对应辅助对象的ElementId
        ///
        /// \param id 对应辅助对象的ElementId
        /// \return void
        virtual void SetElementShapeHandleId(const ElementId& id) = 0;

        /// \brief 获取辅助对象所属ModelView的ElementId
        ///
        /// \return 返回辅助对象所属ModelView的ElementId
        virtual ElementId GetModelViewId() const = 0; 

        /// \brief 根据移动上下文移动辅助对象
        ///
        /// \param moveContext 移动对象的上下文
        /// \return 移动成功返回true，移动失败返回false
        virtual bool Translate(const gcmp::IElementMoveContext& moveContext) = 0;

        /// \brief 获取辅助对象的计算器
        ///
        /// \param calculators 计算器收集器
        /// \return void
        virtual void GetCalculators(ICalculatorCollection* calculators) const = 0;

        /// \brief 报告辅助对象的依赖关系
        ///
        /// \param reporter 依赖关系报告类
        /// \return void
        virtual void ReportParents(IElementParentReporter& reporter) const = 0;

        /// \brief 更新辅助对象的位置
        /// 
        /// \return void
        virtual void UpdatePosition() = 0;

        /// \brief 更新辅助对象的位置索引
        ///
        /// \return void
        virtual void UpdatePositionIndexInMasterElement() = 0;

        /// \brief 获取辅助对象的位置
        ///
        /// \param nearPoint 辅助对象的位置
        /// \return void
        virtual void GetNearestPoint(Vector3d& nearPoint) const = 0;

        /// \brief 创建辅助对象在指定ModelView中的图形表达
        ///
        /// \param pModelView 显示辅助对象的ModelView
        /// \return 辅助对象的图形表达
        virtual gcmp::OwnerPtr<gcmp::IGraphicsElementShape> CreateGrahicsElementShapeInModelView(const gcmp::IModelView* pModelView) const = 0;
    
        virtual bool FinishEditing() = 0;


        /// \brief 获取辅助对象对应的命令字符串和命令参数
        ///
        /// 用户可在自己的UI交互实现中根据实际场景（如双击构件事件发生时）调用此回调传入用户指定的commandEvironment参数指针，通过判断commandEvironment，
        /// 从而达到根据不同场景环境定制不同回调行为的效果。
        /// 注意：目前平台内部ModifyAction实现中，在鼠标单击事件发生时会去调用此回调，commandEnvironment值为nullptr,如果用户没有自己的ModifyAction实现
        /// 而是使用平台的默认ModifyAction的话，请给commandEnveronment传参nullptr，即可获得鼠标单击行为发生时的回调定制。
        /// \param commandEnvironment 辅助对象对应的命令环境信息，用户可自己派生定制
        /// \param commandString 辅助对象对应的命令字符串
        /// \param commandParamters 对应命令的命令参数
        /// \return 获取成功返回true，失败返回false
        virtual bool GetHandleCommandString(const IObject* commandEnvironment, std::wstring& commandString, gcmp::CommandParameters& commandParamters) const = 0;

    };
}
